package create.single;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author lzp
 * @Date:2023/2/24
 * @description: 单例模式测试类
 */
public class SingletonDemo {

	public static void main(String[] args) {
		System.out.println("==================  饿汉式  ====================");
		System.out.println(Singleton1.getInstance() == Singleton1.getInstance());


		// 注意，下方多线程的的测试要一个个测，不要一起测，会影响测试结果，因为后运行的代码可能先输出，线程的执行顺序由CPU决定
		System.out.println("==================  懒汉式 线程不安全的情况  ====================");
		ExecutorService executorService = Executors.newFixedThreadPool(20);
		for (int i = 0; i < 30; i++) {
			// 多线程测试，实例化代码是否只执行一次
			executorService.execute(Singleton3::getInstance);
		}

//		System.out.println("==================  懒汉式 线程安全【锁代码块】的情况  ====================");
//		for (int i = 0; i < 30; i++) {
//			// 多线程测试，实例化代码是否只执行一次
//			executorService.execute(Singleton4::getInstance);
//		}

//		System.out.println("==================  懒汉式 线程安全【双重校验锁】的情况  ====================");
//		for (int i = 0; i < 30; i++) {
//			// 多线程测试，实例化代码是否只执行一次
//			executorService.execute(Singleton5::getInstance);
//		}

		executorService.shutdown();

	}

}
